pci back: Various fixes.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Sat, 10 Mar 2007 17:01:21 +0000 (17:01 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Sat, 10 Mar 2007 17:01:21 +0000 (17:01 +0000)
- remove superfluous call to pciback_field_is_dup()
- fix a variable type mismatch in pciback_field_is_dup()
- make readability improvements by using the OFFSET macro
- revises quirk data output via the sysfs quirks node so that
- displayed offset information includes base_offset.

Thanks to Jambunathan K. for giving such specific bug diagnosis.

Signed-off-by: Chris Bookholt <hap10@tycho.ncsc.mil>
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.c
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space_quirks.h
linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c

index 14e69adeecb681449c0c51f05a096bc7c3899320..4c99534bb380be864b0163d43d29553a511b2e31 100644 (file)
@@ -349,17 +349,13 @@ void pciback_config_free_dev(struct pci_dev *dev)
 
 int pciback_config_add_field_offset(struct pci_dev *dev,
                                    struct config_field *field,
-                                   unsigned int offset)
+                                   unsigned int base_offset)
 {
        int err = 0;
        struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
        struct config_field_entry *cfg_entry;
        void *tmp;
 
-       /* silently ignore duplicate fields */
-       if (pciback_field_is_dup(dev, field->offset + offset))
-               goto out;
-
        cfg_entry = kmalloc(sizeof(*cfg_entry), GFP_KERNEL);
        if (!cfg_entry) {
                err = -ENOMEM;
@@ -368,7 +364,12 @@ int pciback_config_add_field_offset(struct pci_dev *dev,
 
        cfg_entry->data = NULL;
        cfg_entry->field = field;
-       cfg_entry->base_offset = offset;
+       cfg_entry->base_offset = base_offset;
+
+       /* silently ignore duplicate fields */
+       err = pciback_field_is_dup(dev,OFFSET(cfg_entry));
+       if (err)
+               goto out;
 
        if (field->init) {
                tmp = field->init(dev, OFFSET(cfg_entry));
index 4ec0c78b89b17ff2488dda6d27aa66140548f505..525ec95c6580fe11214b91b392de0f604cb6ab1e 100644 (file)
@@ -32,16 +32,14 @@ static inline void register_quirk(struct pciback_config_quirk *quirk)
        list_add_tail(&quirk->quirks_list, &pciback_quirks);
 }
 
-int pciback_field_is_dup(struct pci_dev *dev, int reg)
+int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg)
 {
        int ret = 0;
        struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-       struct config_field *field;
        struct config_field_entry *cfg_entry;
 
        list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-               field = cfg_entry->field;
-               if (field->offset == reg) {
+               if ( OFFSET(cfg_entry) == reg) {
                        ret = 1;
                        break;
                }
index 5c47e1269b5cd583f224745de21b542b32cd27ed..acd0e1ae8fc5afe5d81bf7888e36bb4309d04c7d 100644 (file)
@@ -30,6 +30,6 @@ void pciback_config_field_free(struct config_field *field);
 
 int pciback_config_quirk_release(struct pci_dev *dev);
 
-int pciback_field_is_dup(struct pci_dev *dev, int reg);
+int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg);
 
 #endif
index b33855932de482cfc53bba5ae6b6ee6b25d510ac..7d2118226b56599882addd7ce12c7eb285b8b034 100644 (file)
@@ -589,10 +589,6 @@ static int pcistub_reg_add(int domain, int bus, int slot, int func, int reg,
        }
        dev = psdev->dev;
 
-       /* check for duplicate field */
-       if (pciback_field_is_dup(dev, reg))
-               goto out;
-
        field = kzalloc(sizeof(*field), GFP_ATOMIC);
        if (!field) {
                err = -ENOMEM;
@@ -728,10 +724,10 @@ static ssize_t pcistub_quirk_show(struct device_driver *drv, char *buf)
                        if (count >= PAGE_SIZE)
                                goto out;
 
-                       count += scnprintf(buf + count, PAGE_SIZE -
-                                          count, "\t\t%08x:%01x:%08x\n",
-                                          field->offset, field->size,
-                                          field->mask);
+                       count += scnprintf(buf + count, PAGE_SIZE - count,
+                                          "\t\t%08x:%01x:%08x\n",
+                                          cfg_entry->base_offset + field->offset, 
+                                          field->size, field->mask);
                }
        }